import java.io.IOException;

public class Sudokusup extends Sudoku {

	public Sudokusup(String nombrefic) throws IOException{
		super(nombrefic);
	}

	public String ayuda(int fila, int columna) throws AyudaException{
		String mensaje="";
		if (compr(columna)){

			if (compr(fila)){


				mensaje="Numeros permitidos: "; 
				for(int i=1; i<=9;i++){
					if(comprobarf(fila, i)||comprobarc(columna, i)||comprobarentorno(columna, fila, i)){
					}else{mensaje+=i+" ";}
				}
			}else{throw new AyudaException("La fila debe estar entre 0 y 8");}
		}else{throw new AyudaException("La columna debe estar entre 0 y 8");}
		return mensaje;
	}

	public String poner(int columna, int fila, int valor)throws PonerException{
		String mensaje="";

		if (compristra(valor)){

			if (compr(columna)){

				if (compr(fila)){


					if(tablero[fila][columna].getPista()!=false){
						mensaje="La casilla ("+fila+","+columna+") es una pista y no puede cambiarse";
					}else{

						if(comprobarf(fila, valor)){
							mensaje="El valor "+valor+" ya existe en la fila";
						}else{


							if(comprobarc(columna,valor)){
								mensaje="El valor "+valor+" ya existe en la columna";
							}else if(comprobarentorno(columna, fila, valor)){


								mensaje="El valor "+valor+" ya existe en ese area de 3x3";


							}
						}
					}
					if(mensaje==""){
						if (valor==0){
							mensaje="Se ha borrado el valor"+" en la casilla("+fila+","+columna+")";
							tablero[fila][columna].setValor(-1);
						}else{
							mensaje="Se ha puesto un "+valor+" en "+"("+fila+","+columna+")";
							tablero[fila][columna].setValor(valor);
						}
					}

				}else{throw new PonerException("La fila debe estar entre 0 y 8");}
			}else{throw new PonerException("La columna debe estar entre 0 y 8");}
		}else{throw new PonerException("El valor debe estar entre 0(borrar numero) y 9");}

		return mensaje;

	}
	/**
	 * Comprueba si el valor introducido esta en la fila indicada.
	 * @param fila
	 * @param valor
	 * @return
	 */
	private boolean comprobarf(int fila, int valor){
		boolean a = false;

		for(int j=0; j<tablero.length;j++){
			if(valor==tablero[fila][j].getValor()){
				a=true;
			}
		}

		return a;
	}
	/**
	 * Comprueba si el valor introducido está en la columna indicada.
	 * @param columna
	 * @param valor
	 * @return
	 */
	private boolean comprobarc(int columna, int valor){
		boolean a = false;

		for(int i=0;i<tablero.length;i++){
			if(valor==tablero[i][columna].getValor()){
				a=true;
			}
		}
		return a;
	}
	/**
	 * Comprueba si el valor introducido esta en el area de 3x3.
	 * @param columna
	 * @param fila
	 * @param valor
	 * @return
	 */
	private boolean comprobarentorno(int columna, int fila, int valor){
		boolean comp=false;
		int pf = 0,mf = 0, pc=0, mc=0;
		if(columna<=2&&fila<=2){
			pf=0; mf=pf+2; pc=0; mc=pc+2;
		}else if(columna>=3&&columna<=5&&fila<=2){
			pf=0;mf=pf+2;pc=3;mc=pc+2;
		}else if(columna>=6&&columna<=8&&fila<=2){
			pf=0; mf=pf+2; pc=6; mc=pc+2;
		}else if(columna<=2&&fila>=3&&fila<=5){
			pf=3; mf=pf+2; pc=0; mc=pc+2;

		}else if(fila>=3&&fila<=5&&columna>=3&&columna<=5){
			pf=3; mf=pf+2; pc=3; mc=pc+2;
		}else if(fila>=3&&fila<=5&&columna>=6&&columna<=8){
			pf=3; mf=pf+2; pc=6; mc=pc+2;
		}else if(fila>=6&&fila<=8&&columna<=2){
			pf=6; mf=pf+2; pc=0; mc=pc+2;
		}else if(fila>=6&&fila<=8&&columna>=3&&columna<=5){
			pf=6; mf=pf+2; pc=3; mc=pc+2;
		}else if(fila>=6&&fila<=8&&columna>=6&&columna<=8){
			pf=6; mf=pf+2; pc=6; mc=pc+2;
		}

		for (int j=pf;j<=mf;j++){
			for (int k=pc;k<mc;k++){
				if(valor==tablero[j][k].getValor()){
					comp=true;
				}
			}
		}
		return comp;
	}

}
